Crain was drafted and signed in 2002, playing at the rookie level, and low-A minor league levels going 3–2 with an 0.99 earned run average combined. In 2003, he managed to pitch at all three levels in the minor leagues, going 6–3 with a 3.00 ERA. In 2004, he pitched with the Triple-ARochester Red Wings and went 3–2 with a 2.49 ERA before being called up by the Minnesota Twins.
Major leagues
Minnesota Twins
Crain was called up by the Minnesota Twins in early August 2004, going 3–0 with a 2.00 ERA. In 2005, he made the major league roster. Starting the season 8–0, he set a record for most consecutive wins in relief to start a career. On May 17, 2007, Crain was placed on the 15-day disabled list with a torn rotator cuff and labrum. He missed the rest of the season after undergoing surgery. Crain returned to the team in 2008. He stepped up, along with Craig Breslow, to fill the eighth-inning setup role formerly occupied by Pat Neshek, who was placed on the 60-day disabled list on May 29 with an acute tear of the ulnar collateral ligament in his throwing arm. He went 5–4 for the season, with a 3.59 ERA in 66 games.
After the 2010 season, Crain signed a three-year contract with the Chicago White Sox. Crain was used as the setup man for 2013. From April 17 to June 22, Crain pitched 29 straight scoreless appearances, a franchise record. On July 3, Crain was placed on the disabled list with a right shoulder strain. In 38 games with Chicago, Crain went 2-3 with 19 holds and a 0.74 ERA, striking out 46 in 36.2 innings. Crain was elected to the All-Star Game, but since he was injured, he was replaced by Justin Masterson.
Crain was traded to the Tampa Bay Rays on July 29, 2013, for future considerations. Crain was activated off the disabled list on September 23, but he did not appear in the regular or post season. On October 16, the compensation for the White Sox in the trade was named as minor-leaguers Sean Bierman and Ben Kline.
On December 31, 2013, he agreed to terms on a one-year contract with the Houston Astros. He was placed on the 60-day DL on March 21. He did not play a single game for the Astros.
Second stint with the White Sox
The White Sox signed Crain to a minor league contract on January 22, 2015.
Crain was selected to represent Canada at the World Baseball Classic. In the first game of the 2006 edition of the Classic, Crain came into the game in the 9th inning. He got the save as Canada beat the South Africans 11–8. In the 2009 World Baseball Classic, Crain struck out all four batters he faced in the eighth and ninth innings. Canada ended up losing the game to Italy.